home *** CD-ROM | disk | FTP | other *** search
- Path: uunet!snorkelwacker!apple!sun-barr!rutgers!aramis.rutgers.edu!mcgrew
- From: mcgrew@aramis.rutgers.edu (Charles Mcgrew)
- Newsgroups: comp.sources.sun
- Subject: v02i024: Contool 3.0, Part05/06
- Message-ID: <Sep.25.16.13.02.1990.25578@aramis.rutgers.edu>
- Date: 25 Sep 90 20:13:03 GMT
- Organization: Rutgers Univ., New Brunswick, N.J.
- Lines: 915
- Approved: mcgrew@aramis.rutgers.edu
-
- Submitted-by: chuck@trantor.harris-atd.com (Chuck Musciano)
- Posting-number: Volume 2, Issue 24
- Archive-name: contool3.0/part05
-
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of archive 5 (of 6)."
- # Contents: filters.c
- # Wrapped by chuck@melmac on Fri Aug 17 10:00:53 1990
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'filters.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'filters.c'\"
- else
- echo shar: Extracting \"'filters.c'\" \(26766 characters\)
- sed "s/^X//" >'filters.c' <<'END_OF_FILE'
- X/************************************************************************/
- X/* Copyright 1988-1990 by Chuck Musciano and Harris Corporation */
- X/* */
- X/* Permission to use, copy, modify, and distribute this software */
- X/* and its documentation for any purpose and without fee is */
- X/* hereby granted, provided that the above copyright notice */
- X/* appear in all copies and that both that copyright notice and */
- X/* this permission notice appear in supporting documentation, and */
- X/* that the name of Chuck Musciano and Harris Corporation not be */
- X/* used in advertising or publicity pertaining to distribution */
- X/* of the software without specific, written prior permission. */
- X/* Chuck Musciano and Harris Corporation make no representations */
- X/* about the suitability of this software for any purpose. It is */
- X/* provided "as is" without express or implied warranty. This */
- X/* software may not be sold without the prior explicit permission */
- X/* of Harris Corporation. */
- X/************************************************************************/
- X
- X/************************************************************************/
- X/* */
- X/* filters.c contool filters dialog manager */
- X/* */
- X/************************************************************************/
- X
- X#include <stdio.h>
- X#include <sys/param.h>
- X#include <sys/types.h>
- X#include <xview/xview.h>
- X#include <xview/panel.h>
- X#include <xview/notice.h>
- X#include <xview/xv_xrect.h>
- X
- X#include "manifest.h"
- X#include "contool.h"
- X#include "contool_ui.h"
- X
- XEXPORT Filter *filters = NULL;
- X
- XPUBLIC contool_base_objects *contool_base;
- X
- XPRIVATE short single_bits[] = {
- X#include "images/single.icon"
- X };
- X
- XPRIVATE short range_bits[] = {
- X#include "images/range.icon"
- X };
- X
- XPRIVATE short empty_bits[] = {
- X#include "images/empty.icon"
- X };
- X
- XPRIVATE Filter *edit_set = NULL, *clipboard = NULL;
- XPRIVATE contool_filters_objects *contool_filters = NULL;
- XPRIVATE Server_image single, range, empty;
- X
- X/************************************************************************/
- XPRIVATE int selection_count()
- X
- X{ int i, s, total;
- X
- X total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS);
- X for (i = s = 0; i < total; i++)
- X if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i))
- X s++;
- X return(s);
- X}
- X
- X/************************************************************************/
- XPRIVATE int curr_selection()
- X
- X{ int i, total;
- X
- X for (i = 0, total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS); i < total; i++)
- X if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i))
- X break;
- X if (i >= total)
- X fprintf(stderr, "No item selected!\n");
- X return(i);
- X}
- X
- X/************************************************************************/
- XPRIVATE Filter *duplicate_filter(f)
- X
- XFilter *f;
- X
- X{ Filter *new;
- X
- X new = (Filter *) malloc(sizeof(Filter));
- X *new = *f;
- X new->start = strsave(f->start);
- X new->stop = strsave(f->stop);
- X compile_exp(new, new->start, new->stop);
- X new->command = strsave(f->command);
- X new->comment = strsave(f->comment);
- X new->next = NULL;
- X return(new);
- X}
- X
- X/************************************************************************/
- XPRIVATE Filter *duplicate_list(list)
- X
- XFilter *list;
- X
- X{ Filter *f, *head = NULL, *curr;
- X
- X for (f = list; f; f = f->next)
- X if (head == NULL)
- X head = curr = duplicate_filter(f);
- X else {
- X curr->next = duplicate_filter(f);
- X curr = curr->next;
- X }
- X return(head);
- X}
- X
- X/************************************************************************/
- XPRIVATE free_filter(f)
- X
- XFilter *f;
- X
- X{
- X cond_free(f->start);
- X cond_free(f->start_re);
- X cond_free(f->stop);
- X cond_free(f->stop_re);
- X cond_free(f->command);
- X cond_free(f->comment);
- X free(f);
- X}
- X
- X/************************************************************************/
- XEXPORT free_list(list)
- X
- XFilter *list;
- X
- X{ Filter *next;
- X
- X for ( ; list; list = next) {
- X next = list->next;
- X free_filter(list);
- X }
- X}
- X
- X/************************************************************************/
- XPRIVATE update_controls()
- X
- X{ Filter *f;
- X int i;
- X
- X if (selection_count() == 1) {
- X for (f = edit_set, i = 0; f; f = f->next, i++)
- X if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i))
- X break;
- X if (f == NULL) {
- X error("Internal error: filters do not match scrolling list!");
- X return;
- X }
- X xv_set(contool_filters->filter_update, PANEL_INACTIVE, FALSE, NULL);
- X xv_set(contool_filters->filter_type, PANEL_INACTIVE, FALSE, PANEL_VALUE, f->stop? 1 : 0, NULL);
- X xv_set(contool_filters->start, PANEL_INACTIVE, FALSE, PANEL_VALUE, is_null(f->start), NULL);
- X xv_set(contool_filters->stop, PANEL_INACTIVE, f->stop == NULL, PANEL_VALUE, is_null(f->stop), NULL);
- X xv_set(contool_filters->comment, PANEL_INACTIVE, FALSE, PANEL_VALUE, is_null(f->comment), NULL);
- X xv_set(contool_filters->ignore, PANEL_INACTIVE, FALSE, PANEL_VALUE, f->save? 0 : 1, NULL);
- X if (f->save) {
- X i = 0;
- X if (f->beep) {
- X i |= BEEP_BIT;
- X xv_set(contool_filters->filter_beep_count, PANEL_INACTIVE, FALSE, PANEL_VALUE, f->beep, NULL);
- X xv_set(contool_filters->filter_beep_times, PANEL_INACTIVE, FALSE, NULL);
- X }
- X else {
- X xv_set(contool_filters->filter_beep_count, PANEL_INACTIVE, TRUE, NULL);
- X xv_set(contool_filters->filter_beep_times, PANEL_INACTIVE, TRUE, NULL);
- X }
- X if (f->command) {
- X i |= COMMAND_BIT;
- X xv_set(contool_filters->filter_command, PANEL_INACTIVE, FALSE, PANEL_VALUE, f->command, NULL);
- X xv_set(contool_filters->filter_beep_times, PANEL_INACTIVE, FALSE, NULL);
- X }
- X else
- X xv_set(contool_filters->filter_command, PANEL_INACTIVE, TRUE, NULL);
- X if (f->flash)
- X i |= FLASH_BIT;
- X if (f->open)
- X i |= OPEN_BIT;
- X if (f->stamp)
- X i |= STAMP_BIT;
- X xv_set(contool_filters->action, PANEL_INACTIVE, FALSE, PANEL_VALUE, i, NULL);
- X }
- X else {
- X xv_set(contool_filters->action, PANEL_INACTIVE, TRUE, NULL);
- X xv_set(contool_filters->filter_beep_count, PANEL_INACTIVE, TRUE, NULL);
- X xv_set(contool_filters->filter_beep_times, PANEL_INACTIVE, TRUE, NULL);
- X xv_set(contool_filters->filter_command, PANEL_INACTIVE, TRUE, NULL);
- X }
- X }
- X else {
- X xv_set(contool_filters->filter_update, PANEL_INACTIVE, TRUE, NULL);
- X xv_set(contool_filters->filter_type, PANEL_INACTIVE, TRUE, NULL);
- X xv_set(contool_filters->start, PANEL_INACTIVE, TRUE, NULL);
- X xv_set(contool_filters->stop, PANEL_INACTIVE, TRUE, NULL);
- X xv_set(contool_filters->comment, PANEL_INACTIVE, TRUE, NULL);
- X xv_set(contool_filters->ignore, PANEL_INACTIVE, TRUE, NULL);
- X xv_set(contool_filters->action, PANEL_INACTIVE, TRUE, NULL);
- X xv_set(contool_filters->filter_beep_count, PANEL_INACTIVE, TRUE, NULL);
- X xv_set(contool_filters->filter_beep_times, PANEL_INACTIVE, TRUE, NULL);
- X xv_set(contool_filters->filter_command, PANEL_INACTIVE, TRUE, NULL);
- X }
- X}
- X
- X/************************************************************************/
- XPRIVATE init_filters()
- X
- X{ Filter *f;
- X int i, total;
- X
- X xv_set(contool_filters->filter_list, PANEL_PAINT, PANEL_NO_CLEAR, NULL);
- X for (total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS); total > 0; total--)
- X xv_set(contool_filters->filter_list, PANEL_LIST_DELETE, total - 1, NULL);
- X xv_set(contool_filters->filter_list, PANEL_PAINT, PANEL_CLEAR, NULL);
- X free_list(edit_set);
- X edit_set = duplicate_list(filters);
- X for (i = 0, f = edit_set; f; f = f->next, i++)
- X xv_set(contool_filters->filter_list,
- X PANEL_LIST_INSERT, i,
- X PANEL_LIST_GLYPH, i, f->stop? range : single,
- X PANEL_LIST_STRING, i, f->start,
- X NULL);
- X update_controls();
- X}
- X
- X/************************************************************************/
- XPRIVATE insert_item(pos)
- X
- Xint pos;
- X
- X{ int i, total;
- X Filter *f, *t;
- X
- X total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS);
- X for (i = 0; i < total; i++)
- X if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i))
- X xv_set(contool_filters->filter_list, PANEL_LIST_SELECT, i, FALSE, NULL);
- X xv_set(contool_filters->filter_list, PANEL_LIST_INSERT, pos, NULL);
- X xv_set(contool_filters->filter_list, PANEL_LIST_GLYPH, pos, empty, NULL);
- X xv_set(contool_filters->filter_list, PANEL_LIST_SELECT, pos, TRUE, NULL);
- X if (pos == 0) {
- X f = (Filter *) malloc(sizeof(Filter));
- X f->next = edit_set;
- X edit_set = f;
- X }
- X else {
- X for (i = 1, f = edit_set; i < pos; i++, f = f->next)
- X ;
- X t = f->next;
- X f->next = (Filter *) malloc(sizeof(Filter));
- X f = f->next;
- X f->next = t;
- X }
- X f->start = f->stop = f->comment = NULL;
- X f->beep = defaults.beep;
- X f->command = strsave(defaults.command);
- X f->flash = defaults.flash;
- X f->open = defaults.open;
- X f->stamp = defaults.stamp;
- X f->save = TRUE;
- X update_controls();
- X/* update the scrolling view */
- X}
- X
- X/************************************************************************/
- XPRIVATE paste_items(pos)
- X
- Xint pos;
- X
- X{ int i;
- X Filter *new, *tail, *f;
- X
- X new = duplicate_list(clipboard);
- X for (f = new, i = 0; f; f = f->next, i++) {
- X xv_set(contool_filters->filter_list, PANEL_LIST_INSERT, pos + i, 0);
- X xv_set(contool_filters->filter_list,
- X PANEL_LIST_STRING, pos + i, f->start,
- X PANEL_LIST_GLYPH, pos + i, f->stop? range : single,
- X NULL);
- X tail = f;
- X }
- X if (pos == 0) {
- X tail->next = edit_set;
- X edit_set = new;
- X }
- X else {
- X for (i = 1, f = edit_set; i < pos; i++, f = f->next)
- X ;
- X tail->next = f->next;
- X f->next = new;
- X }
- X update_controls();
- X}
- X
- X/************************************************************************/
- XPRIVATE int update_values(f, flag)
- X
- XFilter *f;
- Xint flag;
- X
- X{ char *start, *stop, *msg;
- X int i;
- X
- X start = (char *) xv_get(contool_filters->start, PANEL_VALUE);
- X if (is_empty(start)) {
- X if (flag)
- X error("You must specify a starting message pattern");
- X return(FALSE);
- X }
- X if (xv_get(contool_filters->filter_type, PANEL_VALUE) == 1)
- X stop = (char *) xv_get(contool_filters->stop, PANEL_VALUE);
- X else
- X stop = NULL;
- X if (msg = compile_exp(f, start, stop)) {
- X if (flag)
- X error(msg);
- X return(FALSE);
- X }
- X if ((int) xv_get(contool_filters->ignore, PANEL_VALUE) == 0) {
- X i = (int) xv_get(contool_filters->action, PANEL_VALUE);
- X if (i & COMMAND_BIT)
- X if (msg = (char *) xv_get(contool_filters->filter_command, PANEL_VALUE))
- X f->command = strsave(msg);
- X else {
- X if (flag)
- X error("You must specify a command for this filter");
- X return(FALSE);
- X }
- X else
- X f->command = NULL;
- X if (i & BEEP_BIT)
- X f->beep = (int) xv_get(contool_filters->filter_beep_count, PANEL_VALUE);
- X else
- X f->beep = 0;
- X f->flash = (i & FLASH_BIT)? TRUE : FALSE;
- X f->open = (i & OPEN_BIT)? TRUE : FALSE;
- X f->stamp = (i & STAMP_BIT)? TRUE : FALSE;
- X f->save = TRUE;
- X }
- X else
- X f->save = FALSE;
- X f->start = strsave(start);
- X f->stop = strsave(stop);
- X f->comment = strsave((char *) xv_get(contool_filters->comment, PANEL_VALUE));
- X return(TRUE);
- X}
- X
- X/************************************************************************/
- XEXPORT Menu_item edit_filters(item, op)
- X
- XMenu_item item;
- XMenu_generate op;
- X
- X{ Filter *f, *curr;
- X
- X if (op == MENU_NOTIFY) {
- X xv_set(contool_base->base, FRAME_BUSY, TRUE, NULL);
- X if (contool_filters == NULL) {
- X contool_filters = contool_filters_objects_initialize(NULL, contool_base->base);
- X place_dialog(contool_base->base, contool_filters->filters);
- X xv_set(contool_filters->filter_list, PANEL_LIST_ROW_HEIGHT, 16, NULL);
- X single = (Server_image) xv_create(NULL, SERVER_IMAGE,
- X XV_WIDTH, 16,
- X XV_HEIGHT, 16,
- X SERVER_IMAGE_BITS, single_bits,
- X 0);
- X range = (Server_image) xv_create(NULL, SERVER_IMAGE,
- X XV_WIDTH, 16,
- X XV_HEIGHT, 16,
- X SERVER_IMAGE_BITS, range_bits,
- X 0);
- X empty = (Server_image) xv_create(NULL, SERVER_IMAGE,
- X XV_WIDTH, 16,
- X XV_HEIGHT, 16,
- X SERVER_IMAGE_BITS, empty_bits,
- X 0);
- X }
- X if (xv_get(contool_filters->filters, XV_SHOW) == FALSE) {
- X edit_set = duplicate_list(filters);
- X free_list(clipboard);
- X clipboard = NULL;
- X init_filters();
- X }
- X xv_set(contool_filters->filters, XV_SHOW, TRUE, NULL);
- X xv_set(contool_base->base, FRAME_BUSY, FALSE, NULL);
- X }
- X return item;
- X}
- X
- X/************************************************************************/
- XEXPORT int filter_notify(item, string, client_data, op, event)
- X
- XPanel_item item;
- Xchar *string;
- XXv_opaque client_data;
- XPanel_list_op op;
- XEvent *event;
- X
- X{
- X if (op == PANEL_LIST_OP_DESELECT || op == PANEL_LIST_OP_SELECT)
- X update_controls();
- X return XV_OK;
- X}
- X
- X/************************************************************************/
- XEXPORT Menu filter_insert_handler(menu, op)
- X
- XMenu menu;
- XMenu_generate op;
- X
- X{
- X xv_set(menu, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X xv_set(contool_filters->filter_insert, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
- X return menu;
- X}
- X
- X/************************************************************************/
- XEXPORT Menu_item insert_at_top(item, op)
- X
- XMenu_item item;
- XMenu_generate op;
- X
- X{
- X xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X xv_set(contool_filters->filter_insert, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
- X if (op == MENU_NOTIFY)
- X insert_item(0);
- X return item;
- X}
- X
- X/************************************************************************/
- XEXPORT Menu_item insert_above(item, op)
- X
- XMenu_item item;
- XMenu_generate op;
- X
- X{
- X xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X xv_set(contool_filters->filter_insert, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
- X if (op == MENU_DISPLAY)
- X xv_set(item, MENU_INACTIVE, selection_count() != 1, NULL);
- X else if (op == MENU_NOTIFY)
- X insert_item(curr_selection());
- X return item;
- X}
- X
- X/************************************************************************/
- XEXPORT Menu_item insert_below(item, op)
- X
- XMenu_item item;
- XMenu_generate op;
- X
- X{
- X xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X xv_set(contool_filters->filter_insert, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
- X if (op == MENU_DISPLAY)
- X xv_set(item, MENU_INACTIVE, selection_count() != 1, NULL);
- X else if (op == MENU_NOTIFY)
- X insert_item(curr_selection() + 1);
- X return item;
- X}
- X
- X/************************************************************************/
- XEXPORT Menu_item insert_at_bottom(item, op)
- X
- XMenu_item item;
- XMenu_generate op;
- X
- X{
- X xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X xv_set(contool_filters->filter_insert, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
- X if (op == MENU_NOTIFY)
- X insert_item(xv_get(contool_filters->filter_list, PANEL_LIST_NROWS));
- X return item;
- X}
- X
- X/************************************************************************/
- XEXPORT Menu filter_edit_handler(menu, op)
- X
- XMenu menu;
- XMenu_generate op;
- X
- X{
- X xv_set(menu, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X xv_set(contool_filters->filter_insert, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
- X xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X return menu;
- X}
- X
- X/************************************************************************/
- XEXPORT Menu_item filter_cut(item, op)
- X
- XMenu_item item;
- XMenu_generate op;
- X
- X{ int i, total;
- X Filter *f, *prev, *curr = NULL;
- X
- X xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X xv_set(contool_filters->filter_edit, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
- X xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X if (op == MENU_DISPLAY)
- X xv_set(item, MENU_INACTIVE, selection_count() == 0, NULL);
- X else if (op == MENU_NOTIFY) {
- X free_list(clipboard);
- X clipboard = NULL;
- X total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS);
- X for (prev = NULL, f = edit_set, i = 0; i < total; i++, f = f->next)
- X if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i)) {
- X if (clipboard == NULL)
- X clipboard = curr = f;
- X else {
- X curr->next = f;
- X curr = curr->next;
- X }
- X if (prev == NULL)
- X edit_set = f->next;
- X else
- X prev->next = f->next;
- X xv_set(contool_filters->filter_list, PANEL_LIST_DELETE, i, NULL);
- X i--;
- X total--;
- X }
- X else
- X prev = f;
- X if (curr)
- X curr->next = NULL;
- X update_controls();
- X xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X }
- X return item;
- X}
- X
- X/************************************************************************/
- XEXPORT Menu_item filter_copy(item, op)
- X
- XMenu_item item;
- XMenu_generate op;
- X
- X{ int i, total;
- X Filter *f, *curr;
- X
- X xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X xv_set(contool_filters->filter_edit, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
- X xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X if (op == MENU_DISPLAY)
- X xv_set(item, MENU_INACTIVE, selection_count() == 0, NULL);
- X else if (op == MENU_NOTIFY) {
- X free_list(clipboard);
- X clipboard = NULL;
- X total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS);
- X for (f = edit_set, i = 0; i < total; i++, f = f->next)
- X if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i))
- X if (clipboard == NULL)
- X clipboard = curr = duplicate_filter(f);
- X else {
- X curr->next = duplicate_filter(f);
- X curr = curr->next;
- X }
- X curr->next = NULL;
- X xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X }
- X return item;
- X}
- X
- X/************************************************************************/
- XEXPORT Menu_item filter_delete(item, op)
- X
- XMenu_item item;
- XMenu_generate op;
- X
- X{ int i, total;
- X Filter *f, *prev, *temp = NULL, *curr;
- X
- X xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X xv_set(contool_filters->filter_edit, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
- X xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X if (op == MENU_DISPLAY)
- X xv_set(item, MENU_INACTIVE, selection_count() == 0, NULL);
- X else if (op == MENU_NOTIFY) {
- X total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS);
- X for (prev = NULL, f = edit_set, i = 0; i < total; i++, f = f->next)
- X if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i)) {
- X if (temp == NULL)
- X temp = curr = f;
- X else {
- X curr->next = f;
- X curr = curr->next;
- X }
- X if (prev == NULL)
- X edit_set = f->next;
- X else
- X prev->next = f->next;
- X xv_set(contool_filters->filter_list, PANEL_LIST_DELETE, i, NULL);
- X i--;
- X total--;
- X }
- X else
- X prev = f;
- X if (curr)
- X curr->next = NULL;
- X free_list(temp);
- X update_controls();
- X xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X }
- X return item;
- X}
- X
- X/************************************************************************/
- XEXPORT Menu_item filter_paste(item, op)
- X
- XMenu_item item;
- XMenu_generate op;
- X
- X{
- X xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X if (op == MENU_DISPLAY)
- X xv_set(item, MENU_INACTIVE, clipboard == NULL, NULL);
- X return item;
- X}
- X
- X/************************************************************************/
- XEXPORT Menu_item paste_at_top(item, op)
- X
- XMenu_item item;
- XMenu_generate op;
- X
- X{
- X xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X if (op == MENU_NOTIFY)
- X paste_items(0);
- X return item;
- X}
- X
- X/************************************************************************/
- XEXPORT Menu_item paste_above(item, op)
- X
- XMenu_item item;
- XMenu_generate op;
- X
- X{
- X xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X if (op == MENU_DISPLAY)
- X xv_set(item, MENU_INACTIVE, selection_count() != 1, NULL);
- X else if (op == MENU_NOTIFY)
- X paste_items(curr_selection());
- X return item;
- X}
- X
- X/************************************************************************/
- XEXPORT Menu_item paste_below(item, op)
- X
- XMenu_item item;
- XMenu_generate op;
- X
- X{
- X xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X if (op == MENU_DISPLAY)
- X xv_set(item, MENU_INACTIVE, selection_count() != 1, NULL);
- X else if (op == MENU_NOTIFY)
- X paste_items(curr_selection() + 1);
- X return item;
- X}
- X
- X/************************************************************************/
- XEXPORT Menu_item paste_at_bottom(item, op)
- X
- XMenu_item item;
- XMenu_generate op;
- X
- X{
- X xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
- X if (op == MENU_NOTIFY)
- X paste_items((int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS));
- X return item;
- X}
- X
- X/************************************************************************/
- XEXPORT void filter_update(item, event)
- X
- XPanel_item item;
- XEvent *event;
- X
- X{ int i, curr;
- X Filter *f;
- X
- X xv_set(item, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
- X
- X curr = curr_selection();
- X for (i = 0, f = edit_set; i < curr; i++, f = f->next)
- X ;
- X if (update_values(f, TRUE))
- X xv_set(contool_filters->filter_list,
- X PANEL_LIST_STRING, curr, f->start,
- X PANEL_LIST_GLYPH, curr, f->stop? range : single,
- X NULL);
- X}
- X
- X/************************************************************************/
- XEXPORT void set_filter_type(item, value, event)
- X
- XPanel_item item;
- Xint value;
- XEvent *event;
- X
- X{
- X xv_set(contool_filters->stop, PANEL_INACTIVE, value == 0, NULL);
- X}
- X
- X/************************************************************************/
- XEXPORT void set_filter_action(item, value, event)
- X
- XPanel_item item;
- Xint value;
- XEvent *event;
- X
- X{ contool_filters_objects *ip = (contool_filters_objects *) xv_get(item, XV_KEY_DATA, INSTANCE);
- X
- X if (value == 0) { /* save this message */
- X xv_set(ip->action, PANEL_INACTIVE, FALSE, NULL);
- X xv_set(ip->filter_beep_count, PANEL_INACTIVE, !((int) xv_get(ip->action, PANEL_VALUE) & BEEP_BIT), NULL);
- X xv_set(ip->filter_beep_times, PANEL_INACTIVE, !((int) xv_get(ip->action, PANEL_VALUE) & BEEP_BIT), NULL);
- X xv_set(ip->filter_command, PANEL_INACTIVE, !((int) xv_get(ip->action, PANEL_VALUE) & COMMAND_BIT), NULL);
- X }
- X else { /* ignore this message */
- X xv_set(ip->action, PANEL_INACTIVE, TRUE, NULL);
- X xv_set(ip->filter_beep_count, PANEL_INACTIVE, TRUE, NULL);
- X xv_set(ip->filter_beep_times, PANEL_INACTIVE, TRUE, NULL);
- X xv_set(ip->filter_command, PANEL_INACTIVE, TRUE, NULL);
- X }
- X}
- X
- X/************************************************************************/
- XEXPORT void set_match_action(item, value, event)
- X
- XPanel_item item;
- Xunsigned int value;
- XEvent *event;
- X
- X{ contool_filters_objects *ip = (contool_filters_objects *) xv_get(item, XV_KEY_DATA, INSTANCE);
- X
- X xv_set(ip->filter_beep_count, PANEL_INACTIVE, !(value & BEEP_BIT), NULL);
- X xv_set(ip->filter_beep_times, PANEL_INACTIVE, !(value & BEEP_BIT), NULL);
- X xv_set(ip->filter_command, PANEL_INACTIVE, !(value & COMMAND_BIT), NULL);
- X}
- X
- X/************************************************************************/
- XEXPORT void filter_done(frame)
- X
- XFrame frame;
- X
- X{
- X free_list(edit_set);
- X edit_set = NULL;
- X free_list(clipboard);
- X clipboard = NULL;
- X xv_set(frame, XV_SHOW, FALSE, 0);
- X}
- X
- X/************************************************************************/
- XPRIVATE int check_for_update()
- X
- X{ int i, result, curr, diff = FALSE;
- X Filter *f, new;
- X
- X if (selection_count() != 1)
- X return(TRUE);
- X curr = curr_selection();
- X for (i = 0, f = edit_set; i < curr; i++, f = f->next)
- X ;
- X new = *f;
- X if (update_values(&new, FALSE) == FALSE)
- X diff = TRUE;
- X else if ((f->start != NULL && new.start == NULL) || (f->start == NULL && new.start != NULL))
- X diff = TRUE;
- X else if ((f->stop != NULL && new.stop == NULL) || (f->stop == NULL && new.stop != NULL))
- X diff = TRUE;
- X else if ((f->comment != NULL && new.comment == NULL) || (f->comment == NULL && new.comment != NULL))
- X diff = TRUE;
- X else if ((f->command != NULL && new.command == NULL) || (f->command == NULL && new.command != NULL))
- X diff = TRUE;
- X else if (f->save != new.save || f->beep != new.beep || f->flash != new.flash || f->open != new.open || f->stamp != new.stamp)
- X diff = TRUE;
- X else if (f->start && strcmp(f->start, new.start) != 0)
- X diff = TRUE;
- X else if (f->stop && strcmp(f->stop, new.stop) != 0)
- X diff = TRUE;
- X else if (f->comment && strcmp(f->comment, new.comment) != 0)
- X diff = TRUE;
- X else if (f->command && strcmp(f->command, new.command) != 0)
- X diff = TRUE;
- X if (diff) {
- X result = notice_prompt(contool_base->base, NULL,
- X NOTICE_MESSAGE_STRINGS,
- X "You have modified the attributes of the selected filter.",
- X " ",
- X "Do you wish to perform an Update before doing an Apply?",
- X NULL,
- X NOTICE_BUTTON_YES, "Update, then Apply",
- X NOTICE_BUTTON_NO, "Apply",
- X NOTICE_BUTTON, "Cancel", 101,
- X NULL);
- X if (result == NOTICE_YES)
- X filter_update(contool_filters->filters, NULL);
- X return(result != 101);
- X }
- X return(TRUE);
- X}
- X
- X/************************************************************************/
- XEXPORT void accept_filters(item, event)
- X
- XPanel_item item;
- XEvent *event;
- X
- X{ Filter *f;
- X int i, total;
- X char *msg = NULL;
- X
- X if (!check_for_update()) {
- X xv_set(item, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
- X return;
- X }
- X
- X total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS);
- X for (i = 0; i < total; i++)
- X if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i))
- X xv_set(contool_filters->filter_list, PANEL_LIST_SELECT, i, FALSE, NULL);
- X for (f = edit_set, i = 0; f; f = f->next, i++)
- X if (is_empty(f->start) || (msg = compile_exp(f, f->start, f->stop))) {
- X xv_set(contool_filters->filter_list, PANEL_LIST_SELECT, i, TRUE, NULL);
- X update_controls();
- X error(msg? msg : "No pattern is specified for the indicated filter");
- X xv_set(item, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
- X return;
- X }
- X free_list(filters);
- X filters = edit_set;
- X if (xv_get(contool_filters->filters, FRAME_CMD_PUSHPIN_IN))
- X edit_set = duplicate_list(filters);
- X else {
- X edit_set = NULL;
- X free_list(clipboard);
- X clipboard = NULL;
- X }
- X filters_changed();
- X}
- X
- X/************************************************************************/
- XEXPORT void reset_filters(item, event)
- X
- XPanel_item item;
- XEvent *event;
- X
- X{
- X init_filters();
- X xv_set(item, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
- X}
- END_OF_FILE
- if test 26766 -ne `wc -c <'filters.c'`; then
- echo shar: \"'filters.c'\" unpacked with wrong size!
- fi
- # end of 'filters.c'
- fi
- echo shar: End of archive 5 \(of 6\).
- cp /dev/null ark5isdone
- MISSING=""
- for I in 1 2 3 4 5 6 ; do
- if test ! -f ark${I}isdone ; then
- MISSING="${MISSING} ${I}"
- fi
- done
- if test "${MISSING}" = "" ; then
- echo You have unpacked all 6 archives.
- rm -f ark[1-9]isdone
- else
- echo You still need to unpack the following archives:
- echo " " ${MISSING}
- fi
- ## End of shell archive.
- exit 0
-
- Chuck Musciano ARPA : chuck@trantor.harris-atd.com
- Harris Corporation Usenet: ...!uunet!x102a!trantor!chuck
- PO Box 37, MS 3A/1912 AT&T : (407) 727-6131
- Melbourne, FL 32902 FAX : (407) 727-{5118,5227,4004}
-
- I'm glad you asked, son. Being popular
- is the most important thing in the world. -- Homer Simpson
-